﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Text;
using Sinacor.Infra.Service.Data;
using Sinacor.Infra.Service.Security.Authorization;

namespace Sinacor.Servico.Bovespa.Contabil.ResourceAccess
{
    /// <summary>
    /// ResourceAccess Class - EventoContabil
    /// </summary>
    public class EventoContabil : BaseResourceAccess
    {
        #region Construtor

        /// <summary>
        /// Construtor
        /// </summary>
        public EventoContabil() : base(AuthorizationContext.Current.CompanyId) { }

        #endregion

        #region Métodos Públicos

        /// <summary>
        /// Serviço irá alterar o EventoContabil informado como parâmetro.
        /// </summary>
        /// <param name="entity">BusinessEntity.EventoContabil</param>
        public void AlterarEventoContabil(BusinessEntity.EventoContabil entity)
        {
            #region Comando SQL

            string sql = "UPDATE TBOEVECON SET DS_EVECON = :Descricao, IN_MUNICIPIO = :UtilizaMunicipio WHERE CD_EVECON = :Codigo";

            #endregion

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql))
            {
                #region Adição dos parâmetros

                this.DataBase.AddInParameter(dbCommand, "Descricao", DbType.String, entity.Descricao);
                if(entity.UtilizaMunicipio.Value)
                    this.DataBase.AddInParameter(dbCommand, "UtilizaMunicipio", DbType.String, "S");
                else
                    this.DataBase.AddInParameter(dbCommand, "UtilizaMunicipio", DbType.String, "N");
                this.DataBase.AddInParameter(dbCommand, "Codigo", DbType.Int32, entity.Codigo);

                #endregion

                #region Execução

                this.DataBase.ExecuteNonQuery(dbCommand);

                #endregion
            }
        }

        /// <summary>
        /// Serviço irá Consultar uma lista de EventosContabeis, utilizando o parâmetro informado.
        /// </summary>
        /// <param name="parameter">BusinessEntity.Parameter.FiltroEventoContabil</param>
        /// <returns>Lista de objetos do tipo BusinessEntity.EventoContabil</returns>
        public List<BusinessEntity.EventoContabil> ConsultarEventosContabeis(BusinessEntity.Parameter.FiltroEventoContabil parameter)
        {
            #region Comando SQL

            StringBuilder sql = new StringBuilder();
            sql.Append("SELECT CD_EVECON Codigo, ");
            sql.Append("DS_EVECON Descricao, ");
            sql.Append("IN_MUNICIPIO UtilizaMunicipio ");
            sql.Append("FROM TBOEVECON ");

            #region Filtros Opcionais

            bool jaContemFiltroOpcional = false;

            if (parameter.Codigo.HasValue)
            {
                jaContemFiltroOpcional = true;
                sql.Append("WHERE CD_EVECON = :Codigo ");
            }
            if (!string.IsNullOrEmpty(parameter.Descricao))
            {
                if (jaContemFiltroOpcional)
                    sql.Append("AND DS_EVECON = :Descricao ");
                else
                {
                    sql.Append("WHERE DS_EVECON = :Descricao ");
                    jaContemFiltroOpcional = true;
                }
            }
            if (parameter.UtilizaMunicipio.HasValue)
            {
                if (jaContemFiltroOpcional)
                    sql.Append("AND IN_MUNICIPIO = :UtilizaMunicipio ");
                else
                    sql.Append("WHERE IN_MUNICIPIO = :UtilizaMunicipio ");
            }

            #endregion

            sql.Append("ORDER BY CD_EVECON");

            #endregion

            List<BusinessEntity.EventoContabil> response = new List<BusinessEntity.EventoContabil>();

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                #region Adição dos Parâmetros

                if(parameter.Codigo.HasValue)
                    this.DataBase.AddInParameter(dbCommand, "Codigo", DbType.Int32, parameter.Codigo);
                if(!string.IsNullOrEmpty(parameter.Descricao))
                    this.DataBase.AddInParameter(dbCommand, "Descricao", DbType.String, parameter.Descricao);
                if (parameter.UtilizaMunicipio.HasValue)
                {
                    if(parameter.UtilizaMunicipio.Value)
                        this.DataBase.AddInParameter(dbCommand, "UtilizaMunicipio", DbType.String, "S");
                    else
                        this.DataBase.AddInParameter(dbCommand, "UtilizaMunicipio", DbType.String, "N");
                }

                #endregion

                #region Execução

                response = this.FindAll<BusinessEntity.EventoContabil>(dbCommand,
                    reader =>
                    {
                        BusinessEntity.EventoContabil entity = new BusinessEntity.EventoContabil();

                        entity.Codigo = reader.GetValue<Int32>("Codigo");
                        entity.Descricao = reader.GetValue<String>("Descricao");
                        if (!String.IsNullOrEmpty(reader.GetValue<String>("UtilizaMunicipio")))
                        {
                            if (reader.GetValue<String>("UtilizaMunicipio").ToUpper() == "S")
                                entity.UtilizaMunicipio = true;
                            else
                                entity.UtilizaMunicipio = false;
                        }
                        else
                        {
                            entity.UtilizaMunicipio = false;
                        }
                        
                        return entity;
                    });

                #endregion
            }

            return response;
        }

        /// <summary>
        /// Serviço irá excluir o EventoContabil informado como parâmetro.
        /// </summary>
        /// <param name="parameter">BusinessEntity.Parameter.FiltroEventoContabilChave</param>
        public void ExcluirEventoContabil(BusinessEntity.Parameter.FiltroEventoContabilChave parameter)
        {
            #region Comando SQL

            string sql = "DELETE FROM TBOEVECON WHERE CD_EVECON = :Codigo";

            #endregion

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql))
            {
                #region Adição dos parâmetros

                this.DataBase.AddInParameter(dbCommand, "Codigo", DbType.Int32, parameter.Codigo);

                #endregion

                #region Execução

                this.DataBase.ExecuteNonQuery(dbCommand);

                #endregion
            }
        }

        /// <summary>
        /// Serviço irá incluir o EventoContabil informado como parâmetro.
        /// </summary>
        /// <param name="entity">BusinessEntity.EventoContabil</param>
        public void IncluirEventoContabil(BusinessEntity.EventoContabil entity)
        {
            #region Comando SQL

            string sql = "INSERT INTO TBOEVECON (CD_EVECON, DS_EVECON, IN_MUNICIPIO) VALUES (:Codigo, :Descricao, :UtilizaMunicipio)";

            #endregion

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql))
            {
                #region Adição dos parâmetros

                this.DataBase.AddInParameter(dbCommand, "Codigo", DbType.Int32, entity.Codigo);
                this.DataBase.AddInParameter(dbCommand, "Descricao", DbType.String, entity.Descricao);

                if(entity.UtilizaMunicipio.Value)
                    this.DataBase.AddInParameter(dbCommand, "UtilizaMunicipio", DbType.String, "S");
                else
                    this.DataBase.AddInParameter(dbCommand, "UtilizaMunicipio", DbType.String, "N");

                #endregion

                #region Execução

                this.DataBase.ExecuteNonQuery(dbCommand);

                #endregion
            }
        }

        /// <summary>
        /// Serviço irá verificar as dependências de contas contábeis.
        /// </summary>
        /// <param name="parameter">BusinessEntity.Parameter.FiltroEventoContabilChave</param>
        /// <returns>bool</returns>
        public bool VerificarDependenciaContasContabeis(BusinessEntity.Parameter.FiltroEventoContabilChave parameter)
        {
            #region Comando SQL

            string sql = "SELECT COUNT(1) FROM TBOCTACON WHERE CD_EVECON = :Codigo";

            #endregion

            bool existemDependencias = false;

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql))
            {
                #region Adição dos parâmetros

                this.DataBase.AddInParameter(dbCommand, "Codigo", DbType.Int32, parameter.Codigo);                

                #endregion

                #region Execução

                if (Convert.ToInt32(this.DataBase.ExecuteScalar(dbCommand)) > 0)
                    existemDependencias = true;

                #endregion
            }

            return existemDependencias;
        }

        /// <summary>
        /// Serviço irá verificar as dependências de despesas nota.
        /// </summary>
        /// <param name="parameter">BusinessEntity.Parameter.FiltroEventoContabilChave</param>
        /// <returns>bool</returns>
        public bool VerificarDependenciaDespesasNota(BusinessEntity.Parameter.FiltroEventoContabilChave parameter)
        {
            #region Comando SQL

            string sql = "SELECT COUNT(1) FROM TBODESPNO WHERE CD_EVECON = :Codigo";

            #endregion

            bool existemDependencias = false;

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql))
            {
                #region Adição dos parâmetros

                this.DataBase.AddInParameter(dbCommand, "Codigo", DbType.Int32, parameter.Codigo);

                #endregion

                #region Execução

                if (Convert.ToInt32(this.DataBase.ExecuteScalar(dbCommand)) > 0)
                    existemDependencias = true;

                #endregion
            }

            return existemDependencias;
        }

        /// <summary>
        /// Serviço irá verificar as dependências de mercado natureza.
        /// </summary>
        /// <param name="parameter">BusinessEntity.Parameter.FiltroEventoContabilChave</param>
        /// <returns>bool</returns>
        public bool VerificarDependenciaMercadoNatureza(BusinessEntity.Parameter.FiltroEventoContabilChave parameter)
        {
            #region Comando SQL

            string sql = "SELECT COUNT(1) FROM TBOMERNAT WHERE CD_EVECON = :Codigo";

            #endregion

            bool existemDependencias = false;

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql))
            {
                #region Adição dos parâmetros

                this.DataBase.AddInParameter(dbCommand, "Codigo", DbType.Int32, parameter.Codigo);

                #endregion

                #region Execução

                if (Convert.ToInt32(this.DataBase.ExecuteScalar(dbCommand)) > 0)
                    existemDependencias = true;

                #endregion
            }

            return existemDependencias;
        }

        /// <summary>
        /// Serviço irá verificar as dependências de movimentação contábil.
        /// </summary>
        /// <param name="parameter">BusinessEntity.Parameter.FiltroEventoContabilChave</param>
        /// <returns>bool</returns>
        public bool VerificarDependenciaMovimentacaoContabil(BusinessEntity.Parameter.FiltroEventoContabilChave parameter)
        {
            #region Comando SQL

            string sql = "SELECT COUNT(1) FROM TBOMOVCON WHERE CD_EVECON = :Codigo";

            #endregion

            bool existemDependencias = false;

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql))
            {
                #region Adição dos parâmetros

                this.DataBase.AddInParameter(dbCommand, "Codigo", DbType.Int32, parameter.Codigo);

                #endregion

                #region Execução

                if (Convert.ToInt32(this.DataBase.ExecuteScalar(dbCommand)) > 0)
                    existemDependencias = true;

                #endregion
            }

            return existemDependencias;
        }

        #endregion
    }
}